package com.synclovis;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Build;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.synclovis.service.StepService;

import static android.content.Context.SENSOR_SERVICE;

public class RNWalkCounterModule extends ReactContextBaseJavaModule {

  private final ReactApplicationContext reactContext;

  public RNWalkCounterModule(ReactApplicationContext reactContext) {
    super(reactContext);
    this.reactContext = reactContext;
  }

  @Override
  public String getName() {
    return "RNWalkCounter";
  }

  @ReactMethod
  public void startCounter(){
    setupService();
  }

  private boolean isBind = false;

  /**
   * 开启计步服务
   */
  private void setupService() {
     if(reactContext!=null){
       try {
         Intent intent = new Intent(reactContext, StepService.class);
         isBind = reactContext.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
//         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//          reactContext.startForegroundService(intent);
//         } else {
//         }
           reactContext.startService(intent);
       } catch (Exception e) {
         e.printStackTrace();
       }
     }
  }

  /**
   * 用于查询应用服务（application Service）的状态的一种interface，
   * 更详细的信息可以参考Service 和 context.bindService()中的描述，
   * 和许多来自系统的回调方式一样，ServiceConnection的方法都是进程的主线程中调用的。
   */
  ServiceConnection serviceConnection = new ServiceConnection() {
    /**
     * 在建立起于Service的连接时会调用该方法，目前Android是通过IBind机制实现与服务的连接。
     * @param name 实际所连接到的Service组件名称
     * @param service 服务的通信信道的IBind，可以通过Service访问对应服务
     */
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
      StepService stepService = ((StepService.StepBinder) service).getService();

      //设置步数监听回调
      stepService.registerCallback(new UpdateUiCallBack() {
        @Override
        public void updateUi(int stepCount) {
          Log.e("StepService","stepCount="+stepCount);
          onStepRunning(stepCount);
        }
      });
    }

    /**
     * 当与Service之间的连接丢失的时候会调用该方法，
     * 这种情况经常发生在Service所在的进程崩溃或者被Kill的时候调用，
     * 此方法不会移除与Service的连接，当服务重新启动的时候仍然会调用 onServiceConnected()。
     * @param name 丢失连接的组件名称
     */
    @Override
    public void onServiceDisconnected(ComponentName name) {

    }
  };


  public void onStepRunning(long newSteps){
    WritableMap params = Arguments.createMap();
    params.putString("steps", ""+newSteps);
    this.reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
            .emit("onStepRunning",params);
  }

  @ReactMethod
  public void stopCounter(){
//    sensorManager.unregisterListener(this);
  }

}
